//
//  StatusCell.swift
//  HMWeibo06
//
//  Created by apple on 15/5/17.
//  Copyright (c) 2015年 heima. All rights reserved.
//

import UIKit
import SDWebImage

class StatusCell: UITableViewCell {

    // 头像
    @IBOutlet weak var iconView: UIImageView!
    // 姓名
    @IBOutlet weak var nameLabel: UILabel!
    // 时间
    @IBOutlet weak var timeLabel: UILabel!
    // 来源
    @IBOutlet weak var sourceLabel: UILabel!
    // 正文
    @IBOutlet weak var contentLabel: UILabel!
    // MARK: - 配图属性
    // 视图宽度
    @IBOutlet weak var pictureViewWidth: NSLayoutConstraint!
    // 视图高度
    @IBOutlet weak var pictureViewHeight: NSLayoutConstraint!
    // 视图布局
    @IBOutlet weak var pictureViewLayout: UICollectionViewFlowLayout!
    /// 配图视图
    @IBOutlet weak var pictureView: UICollectionView!
    /// 底部视图
    @IBOutlet weak var bottomView: UIView!
    /// 转发微博的文字
    @IBOutlet weak var forwardLabel: UILabel!
    
    // 微博数据
    var status: Status? {
        didSet {
            nameLabel.text = status?.user?.name
            timeLabel.text = status?.created_at
            sourceLabel.text = status?.source
            contentLabel.text = status?.text
            
            // 设置头像
            iconView.sd_setImageWithURL(status?.user?.iconURL)
            
            // 计算配图大小
            let pSize = calcPictureViewSize(status!)
            pictureViewWidth.constant = pSize.viewSize.width
            pictureViewHeight.constant = pSize.viewSize.height
            // 设置 layout 的大小
            pictureViewLayout.itemSize = pSize.itemSize
            
            // 让 collectionView 刷新数据
            pictureView.reloadData()
            
            // 判断是否是转发微博
            forwardLabel?.text = (status?.retweeted_status?.user?.name ?? "") + ":" + (status?.retweeted_status?.text ?? "")
        }
    }
    
    /**
    可重用标示符号
    */
    class func cellIdentifier(status: Status) -> String {
        if status.retweeted_status != nil {
            return "ForwardCell"
        }
        return "HomeCell"
    }
    
    /**
    根据微博数据计算行高
    */
    func rowHeight(status: Status) -> CGFloat {
        // 1. 设置微博数据
        self.status = status
        
        // 2. 强制更新自动布局
        layoutIfNeeded()
        
        // 3. 返回底部视图的最大高度
        return CGRectGetMaxY(bottomView.frame)
    }
    
    /**
    计算图像视图的大小
    
        1> 没有图像，CGRectZero
        2> 一张图片，图像的原始尺寸
        3> 4张图片，固定大小的 2 * 2
        4> 多张图片，固定大小的 3 * 3
    
        元组->可以包含多个值
    */
    private func calcPictureViewSize(status: Status) -> (viewSize: CGSize, itemSize: CGSize) {
        
        // 单张图片默认大小
        let s: CGFloat = 90
        let itemSize = CGSizeMake(s, s)
        // 图片间距
        let m: CGFloat = 10
        // 图片的数量
        let imageCount = status.pictureURLs?.count ?? 0
        
        // 1. 没有图像
        if imageCount == 0 {
            return (CGSizeZero, itemSize)
        }
        
        // 2. 一张图片
        if imageCount == 1 {
            // 利用 sdwebimage 从缓存加载图像
            // 缓存图像的 key 是 图像的 URL，注意：不是保存在磁盘中的图片名
            // 保存的文件名，是 URL 的 MD5
            let key = status.pictureURLs![0].absoluteString
            let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
            
            println("单张图片 \(image.size)")
            return (image.size, image.size)
        }
        
        // 3. 四张图片
        if imageCount == 4 {
            println("四张图片")
            return (CGSizeMake(s * 2 + m, s * 2 + m), itemSize)
        }
        
        // 4. 执行到此，就是多张图片
        // 1> 计算行数
        /**
            1, 2, 3 => 1
            4, 5, 6 => 2
        */
        println("多张图片 \(imageCount)")
        let row = CGFloat((imageCount - 1) / 3 + 1)
        return (CGSizeMake(s * 3 + m * 2, row * s + (row - 1) * m), itemSize)
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        // 提示，此处的 cell 的大小还没有被设置
//        println(frame)
        contentLabel.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
        // EXC_BAD 错误是找不到对象
        forwardLabel?.preferredMaxLayoutWidth = UIScreen.mainScreen().bounds.width - 20
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}

extension StatusCell: UICollectionViewDataSource {
    
    // 数据行数，配图数量
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return status?.pictureURLs?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("PictureCell", forIndexPath: indexPath) as! PictureCell
        
        // 设置 cell
        cell.url = status!.pictureURLs![indexPath.item]
        
        return cell
    }
}

/**
*  配图视图的 Cell
*/
class PictureCell: UICollectionViewCell {
    
    @IBOutlet weak var iconView: UIImageView!
    
    var url: NSURL? {
        didSet {
            // 因为 SDWebImage 已经做好了缓存，实际使用中，会直接从缓存加载图像，不会上网访问
            iconView.sd_setImageWithURL(url)
        }
    }
}
